/*
 * BaseHibernateDAO。java
 *
 * Created Date: 2014年11月26日
 *				
 * Copyright (c)  Centling Technologies Co., Ltd.
 *
 * This software is the confidential and proprietary information of
 *  Centling Technologies Co., Ltd. ("Confidential Information"). You shall not
 * disclose such Confidential Information and shall use it only in accordance
 * with the terms of the license agreement you entered into with
 * Centling Technologies Co., Ltd.
 */

package com.centling.bluecollar.base;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class BaseHibernateDAO {
	//
	@Resource
	public SessionFactory sessionFactory;
	
	public Session getSession() {
		Session session = sessionFactory.getCurrentSession();
		if (session == null) {
			session = sessionFactory.openSession();
		}
		return session;
	}
	 /**
     * @Description: HQL查询分页
     * @param nStartRow 开始行数
     * @param nRowSize 数量
     * @param strHQL HQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:05:58
     * @return List<?>    返回类型
     */
    public List<?> getListByHQL(int nStartRow, int nRowSize, String strHQL, String... strParams){
        //log.debug("HQL：" + strHQL + "\n Params：" + ArrayUtils.toString(strParams));
        Query query=getSession().createQuery(strHQL);
        for (int j = 0,i=0; j < strParams.length; j++) {
        	if(strParams[j]!=null) {
        		if(!strParams[j].equals("")){
        		   query.setString(i, strParams[j]);
        		   i++;
        		}
        	}
        }
        if (nRowSize > 0 && nStartRow > -1) {
            query.setFirstResult((nStartRow-1)*nRowSize);
            query.setMaxResults(nRowSize);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        List<?> objList = query.list();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        return objList;
    }
    
    
    /**
     * @Description: HQL查询获取当前查询条件的数据的个数
     * @param nStartRow
     * @param nRowSize
     * @param strHQL
     * @param strParams
     * @return
     * @date 2014-11-26
     * @author hellsing
     */
    public int getCountByHQL(String strHQL, String... strParams){
        //log.debug("HQL：" + strHQL + "\n Params：" + ArrayUtils.toString(strParams));
        Query query=getSession().createQuery(strHQL);
        for (int j = 0,i=0; j < strParams.length; j++) {
        	if(strParams[j]!=null) {
        		if(!strParams[j].equals("")){
        		   query.setString(i, strParams[j]);
        		   i++;
        		}
        	}
        }

        List<?> objList = query.list();
        if(objList!=null) {
        	return objList.size();
        }
        return 0;
    }

    /**
     * @Description: 根据HQL语句查询返回Object
     * @param strHQL HQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:08:47
     * @return Object    返回类型
     */
    public Object getObjectByHQL(String strHQL, String... strParams){
        //log.debug("HQL：" + strHQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createQuery(strHQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        Object objResult = query.uniqueResult();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        return objResult;
    }


    /**
     * @Description: 根据HQL语句执行增删改
     * @param strHQL HQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:10:57
     * @return boolean    返回类型
     */
    public boolean doCUDByHQL(String strHQL, String... strParams){
        //log.debug("HQL：" + strHQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query =  getSession().createQuery(strHQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        int influenceRowCount = query.executeUpdate();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        if (influenceRowCount > 0) {
            return true;
        }
        return false;
    }


    /**
     * @Description: 保存或者更新对象
     * @param obj 对象实体
     * @throws Exception
     * @date 2014-7-28 下午3:12:52
     * @return void    返回类型
     */
    public void doSaveObject(Object obj){
        //log.debug("Object：" + obj.getClass());
        getSession().saveOrUpdate(obj);
    }
    /**
     * @Description: 保存或者更新对象
     * @param obj 对象实体
     * @throws Exception
     * @date 2014-7-28 下午3:12:52
     * @return void    返回类型
     */
    public void doSaveOrUpdateObject(Object obj){
    	//log.debug("Object：" + obj.getClass());
    	getSession().saveOrUpdate(obj);
    }


    /**
     * @Description:保存用户对象
     * @param obj 对象实体
     * @date 2014-6-16 上午10:03:44
     * @return void    返回类型
     */
    public void doSave(Object obj){
        this.getSession().save(obj);
    }

    /**
     * @Description:删除用户对象，对象须有主键
     * @param obj 对象实体
     * @date 2014-12-17 上午10:03:44
     * @return void    返回类型
     */
    public void doDelete(Object obj){
    	this.getSession().delete(obj);
    }
    
	/**
     * @Description: 根据SQL语句获得对象
     * @param strSQL SQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:14:21
     * @return Object    返回类型
     */
    public Object getObjectBySQL(String strSQL, String... strParams){
        //log.debug("SQL：" + strSQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createSQLQuery(strSQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        Object objResult = query.uniqueResult();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        return objResult;
    }


    /**
     * @Description: 根据指定行数查询数据
     * @param nStartRow 开始数
     * @param nRowSize 数量
     * @param strSQL SQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:15:49
     * @return List<?>    返回类型
     */
    public List<?> getListBySQL(int nStartRow, int nRowSize, String strSQL, String... strParams){
        //log.debug("SQL：" + strSQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createSQLQuery(strSQL);
        
        for (int j = 0,i=0; j < strParams.length; j++) {
        	if(strParams[j]!=null) {
        		if(!strParams[j].equals("")){
        		   query.setString(i, strParams[j]);
        		   i++;
        		}
        	}
        }
        if (nRowSize > 0 && nStartRow > -1) {
            query.setFirstResult(nStartRow);
            query.setMaxResults(nRowSize);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        List<?> objList = query.list();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        return objList;
    }


    /**
     * @Description: 执行存储过程
     * @param strPROCSQL 存储过程
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:19:13
     * @return boolean    返回类型
     */
    public boolean doProcUpdate(String strPROCSQL, String... strParams){
        //log.debug("PROCSQL：" + strPROCSQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createSQLQuery(strPROCSQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        int influenceRowCount = query.executeUpdate();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        if (influenceRowCount > 0) {
            return true;
        }
        return false;
    }


    /**
     * @Description: 执行带有返回值的存储过程
     * @param strPROCSQL SQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:20:26
     * @return List<?>    返回类型
     */
    public List<?> getProcResult(String strPROCSQL, String... strParams){
        //log.debug("PROCSQL：" + strPROCSQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createSQLQuery(strPROCSQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        List<?> list = query.list();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());

        return list;

    }


    /**
     * @Description: 执行未有参数的存储过程
     * @param strPROCSQL SQL语句
     * @param strParams 参数
     * @throws Exception
     * @date 2014-7-28 下午3:21:24
     * @return void    返回类型
     */
    public void doProcQuery(String strPROCSQL, String... strParams){
        //log.debug("PROCSQL：" + strPROCSQL + "\n Params：" + ArrayUtils.toString(strParams));

        Query query = getSession().createSQLQuery(strPROCSQL);
        for (int j = 0; j < strParams.length; j++) {
            query.setString(j, strParams[j]);
        }

        //log.debug("BEGIN：" + DateUtils.getStrOfDateMinute());
        query.list();
        //log.debug("END：" + DateUtils.getStrOfDateMinute());
    }


    /**
     * @Description: 清空当前session操作
     * @date 2014-7-28 下午3:21:54
     * @return void    返回类型
     */
    public void doSessionClear() {
        getSession().clear();
    }

}
